package reflect;

import reflect.annotations.AutoRunClass;

import java.io.OutputStream;
import java.io.Writer;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Scanner;

public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {

        /*
            Class类
            Class类的实例被称为"类对象"
            JVM在加载一个类的字节码文件到内部时就会实例化一个Class实例
            与加载的类型对应，用这个Class实例记录加载的类的相关信息。并且
            在JVM内部每个被加载的类【都有且只有一个】类对象与之对应。

            获取一个类的类对象方式有：
            1:类名.class
            Class cls = String,class;
            Class cls = int.class;

            2.Class.forName(String className)

            3.使用ClassLoader加载

            4.
         */
        //获取String的类对象
//        Class cls = Person.class;
//        Class cls = Class.forName("reflect.Person");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个类名:");
        String className = scanner.nextLine();
        Class cls = Class.forName(className);
        String name = cls.getName();//获取类的完全限定名
        System.out.println(name);
        name = cls.getSimpleName();//仅获取类名
        System.out.println(name);

        /*
            Method类
            Method类的每一个实例成为"方法对象“
            该类的每一个实例表示某个类中的一个方法。
         */

        Method[] methods = cls.getMethods();
        System.out.println(name+"一共有"+methods.length+"个公开方法");
        for(Method method : methods){
            System.out.println(method.getName());
        }
    }
}
